package it.sisisoftware.jogmobile;


import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.os.Handler;
import android.speech.RecognizerIntent;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;



	/**
	 * Sample code that invokes the speech recognition intent API.
	 */
	public class Comandivocali extends Activity implements OnClickListener {

	    private static final String TAG = "VoiceRecognition";

	    private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;

	    private ListView mList;

	    private Handler mHandler;

	    private Spinner mSupportedLanguageView;

	    /**
	     * Called with the activity is first created.
	     */
	    @Override
	    public void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        mHandler = new Handler();

	        // Inflate our UI from its XML layout description.
	        setContentView(R.layout.voice_recognition);

	        // Get display items for later interaction
	        Button speakButton = (Button) findViewById(R.id.btn_speak);

	        mList = (ListView) findViewById(R.id.list);

	        mSupportedLanguageView = (Spinner) findViewById(R.id.supported_languages);

	        // Check to see if a recognition activity is present
	        PackageManager pm = getPackageManager();
	        List<ResolveInfo> activities = pm.queryIntentActivities(
	                new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
	        if (activities.size() != 0) {
	            speakButton.setOnClickListener(this);
	        } else {
	            speakButton.setEnabled(false);
	            speakButton.setText("Recognizer not present");
	        }

	        // Most of the applications do not have to handle the voice settings. If the application
	        // does not require a recognition in a specific language (i.e., different from the system
	        // locale), the application does not need to read the voice settings.
	        refreshVoiceSettings();
	    }

	    /**
	     * Handle the click on the start recognition button.
	     */
	    public void onClick(View v) {
	        if (v.getId() == R.id.btn_speak) {
	            startVoiceRecognitionActivity();
	        }
	    }

	    /**
	     * Fire an intent to start the speech recognition activity.
	     */
	    private void startVoiceRecognitionActivity() {
	        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);

	        // Specify the calling package to identify your application
	        intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getClass().getPackage().getName());

	        // Display an hint to the user about what he should say.
	        intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "JOG ti ascolta");

	        // Given an hint to the recognizer about what the user is going to say
	        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
	                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);

	        // Specify how many results you want to receive. The results will be sorted
	        // where the first result is the one with higher confidence.
	        intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 5);

	        // Specify the recognition language. This parameter has to be specified only if the
	        // recognition has to be done in a specific language and not the default one (i.e., the
	        // system locale). Most of the applications do not have to set this parameter.
	        if (!mSupportedLanguageView.getSelectedItem().toString().equals("Default")) {
	            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,
	                    mSupportedLanguageView.getSelectedItem().toString());
	        }

	        startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
	    }

	    /**
	     * Handle the results from the recognition activity.
	     */
	    @Override
	    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	        if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {
	            // Fill the list view with the strings the recognizer thought it could have heard
	            ArrayList<String> matches = data.getStringArrayListExtra(
	                    RecognizerIntent.EXTRA_RESULTS);
	            for (String string : matches) {
	            	
	            	int strlen = string.length();
	            	
	            	if (string.toUpperCase().contains("ESTRATTO CONTO") && strlen > 15) {
	            		
						string = string.replaceAll("estratto conto di","");
						
						string = string.replaceAll("estratto conto","");
						
						Intent intent = new Intent(this, ViewNominativi.class);
						Bundle bundle = new Bundle();
						
						bundle.putString("NOME_DA_CERCARE", string);
						bundle.putString("ESTRATTO_CONTO_SINGOLO", "1");
						intent.putExtras(bundle);
						
					 	startActivity(intent);
					 	break;
					}
	            	
					if (string.toUpperCase().contains("ESTRATTO")) {
						Intent intent = new Intent(this, ViewECTotale.class);
					 	  startActivity(intent);
					 	  break;
					}
					
					if (string.toUpperCase().contains("CERCA CLIENTE") || string.toUpperCase().contains("CERCA FORNITORE")) {
						
						
						Intent intent = new Intent(this, ViewNominativi.class);
						Bundle bundle = new Bundle();
						
						if (string.toUpperCase().contains("CERCA CLIENTE")) {
							bundle.putString("OPERAZIONE", "CLIENTI");
							}
							if (string.toUpperCase().contains("CERCA FORNITORE")) {
							bundle.putString("OPERAZIONE", "FORNITORI");
							}
						
						string = string.replaceAll("cerca cliente","");
						string = string.replaceAll("cerca fornitore","");
						
						
						
						bundle.putString("NOME_DA_CERCARE", string);
						intent.putExtras(bundle);
						
					 	startActivity(intent);
					 	
					 	//int sehacapito == 1;
					 	
					 	break;
					}
					
					
					
					
				}
	            
	         // deve dire che non ha capito
	            
	            mList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
	                    matches));
	        }

	        super.onActivityResult(requestCode, resultCode, data);
	    }

	    private void refreshVoiceSettings() {
	        Log.i(TAG, "Sending broadcast");
	        sendOrderedBroadcast(RecognizerIntent.getVoiceDetailsIntent(this), null,
	                new SupportedLanguageBroadcastReceiver(), null, Activity.RESULT_OK, null, null);
	    }

	    private void updateSupportedLanguages(List<String> languages) {
	        // We add "Default" at the beginning of the list to simulate default language.
	        languages.add(0, "IT");

	        SpinnerAdapter adapter = new ArrayAdapter<CharSequence>(this,
	                android.R.layout.simple_spinner_item, languages.toArray(
	                        new String[languages.size()]));
	        mSupportedLanguageView.setAdapter(adapter);
	    }

	    private void updateLanguagePreference(String language) {
	        TextView textView = (TextView) findViewById(R.id.language_preference);
	        textView.setText(language);
	    }

	    /**
	     * Handles the response of the broadcast request about the recognizer supported languages.
	     *
	     * The receiver is required only if the application wants to do recognition in a specific
	     * language.
	     */
	    private class SupportedLanguageBroadcastReceiver extends BroadcastReceiver {

	        @Override
	        public void onReceive(Context context, final Intent intent) {
	            Log.i(TAG, "Receiving broadcast " + intent);

	            final Bundle extra = getResultExtras(false);

	            if (getResultCode() != Activity.RESULT_OK) {
	                mHandler.post(new Runnable() {
	                   
	                    public void run() {
	                        showToast("Error code:" + getResultCode());
	                    }
	                });
	            }

	            if (extra == null) {
	                mHandler.post(new Runnable() {
	                    
	                    public void run() {
	                        showToast("No extra");
	                    }
	                });
	            }

	            if (extra.containsKey(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES)) {
	                mHandler.post(new Runnable() {

	                   
	                    public void run() {
	                        updateSupportedLanguages(extra.getStringArrayList(
	                                RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES));
	                    }
	                });
	            }

	            if (extra.containsKey(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE)) {
	                mHandler.post(new Runnable() {

	                   
	                    public void run() {
	                        updateLanguagePreference(
	                                extra.getString(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE));
	                    }
	                });
	            }
	        }

	        private void showToast(String text) {
	            Toast.makeText(Comandivocali.this, text, 1000).show();
	        }
	    }
	}
	